Amazon Lambda 関数で VPC フローログを Splunk Cloud に送信してみた!
10/3、Splunk 社のパートナー向けオフライン勉強会を開催いただき、AWS のデータ取り込みについてセッションを受講してきました。
本ブログでは、セッション内でご説明いただいた Amazon Lambda 関数を使って Splunk Cloud にデータを送信する方法についてご紹介します。
講師およびハンズオンの概要
- 講師: Splunk APAC クラウドテクニカルストラテジスト Trav Kane(T-REX)さん
- 所要時間: 20分
- 前提知識: Splunk Basic Workshop受講済みレベルの知識(Splunkの不定期開催ワークショップから申し込み可)、AWSサービスに関する一般知識
- ハンズオン資料: こちらに公開されています
- コンテンツ: Lab4 - Setting up VPC flow logs to stream data into Splunk using Amazon Lambda PUSH method.
- ※本ブログは上記ハンズオン内容に沿った内容となっております。
設定の流れ
- HEC トークンを作成する
- VPC フローログを CloudWatch に出力する
- Splunk Cloud にログを送信する Lambda 関数をデプロイする
- Lambda 関数を呼び出すための CloudWatch サブスクリプションフィルターを作成する
構成図
CloudWatch ロググループに出力されるログを Lambda 関数で HEC に送信していきます。
それでは早速やってみましょう!
HEC トークンを作成する
HEC トークンを作成するには HTTP Event Collector を作成します。
- Setting(設定) > Data Input(データ入力)を選択
- HTTP Event Collector を選択
- New Token(新規トークン)を選択
- HEC Token の Name を入力(例:画像)
- 任意で Enable Indexer ack knowledgement を設定する
Enable Indexer ack knowledgement は、取り込んだデータの重複や欠落を防ぐための機能です。Splunk Cloud では、データ取り込みパイプラインに Amazon Data Firehose を使う場合に限り、有効化することで Splunk がデータを Indexer に登録した後、ackID というものを発行し、フォワーダーへ通知をする仕組みになっており、ユーザ環境と Splunk Cloud 間での NW 断絶や Splunk インスタンスの停止などに備え、ackID を受けたデータが Indexer に登録されていることを証明するように動作させることができます。
参考:About HTTP Event Collector Indexer Acknowledgment | Splunk Docs
-
NEXT を選択
-
ソースタイプの欄で select(選択)の項目を選択する
-
Select Source Type(ソースタイプの選択)を選択し、既存のソースタイプを選択するか、ここで新たに作成する
-
任意のインデックスを選択する
-
review(確認)して問題なければ Submit(実行)する
- 払い出された HEC Token をどこかにコピーする
VPC フローログを CloudWatch に出力する
VPC フローログの配信には、CloudWatch ロググループと IAM ロールが必要なので先に作成していきます。
CloudWatch ロググループの作成
VPC フローログの出力先となる Amazon CloudWatch ロググループを作成します
- AWS コンソールで CloudWatch を開き「ロググループ」を選択
- 「ロググループを作成」を選択
- ロググループ名を入力
- 任意の保持期間を選択
- 任意のログクラスを選択
- 任意で KMS キーを選択
- 作成を選択し、ARN をコピーしてどこかに保存
IAM ポリシーの作成
IAM ロールに付与する IAM ポリシーを作成します
- AWS コンソールで IAM を開き「ポリシー」を選択
- 「ポリシーを作成」を選択
- ポリシーエディタにCloudWatch Logs にフローログを公開するための IAM ロールの権限付与し、Resource ノードに先ほどコピーした CloudWatch ロググループの ARN をペースト
- ポリシー名を入力して、ポリシーの作成を選択
IAM ロールの作成
VPC フローログを Amazon CloudWatch ロググループに発行するアクセス許可を持つ IAM ロールを作成します
- AWS コンソールで IAM を開き「ロール」を選択
- 「ロールを作成」を選択
- 信頼されたエンティティで「カスタム信頼ポリシー」を選択
- カスタム信頼ポリシーで「CloudWatch Logs にフローログを公開するための IAM ロール」ページの信頼ポリシーをペーストして次へを選択
- 許可ポリシーで先ほど作成した IAM ポリシーを追加して次へを選択
- ロール名を入力して「ロールを作成」を選択
VPC フローログの作成
- AWS コンソールで VPC を開き「お使いの VPC」を選択
- ログ収集対象の VPC を選択
- 「フローログ」を選択し、「フローログを作成」を選択
- 名前を入力
- 最大集約間隔を任意で選択
- 送信先で「CloudWatch Logs に送信」を選択
- 送信先ロググループに先ほど作成したロググループを選択
- IAM ロールに先ほど作成した IAM ロールを選択
- フローログを作成を選択
一度、CloudWatch でロググループに VPC フローログが出力されているか確認してみましょう。
CloudWatch > ロググループ で作成したロググループを選択します。
ログストリームが生成されているはずです。中身も見てみます。
適切に出力されていることを確認できました。ここまでこれば、あとは Lambda を使って Splunk Cloud に送信するだけです。
Splunk Cloud にログを送信する Lambda 関数をデプロイする
Lambda 関数は、Serverless Application Repository に公開されているリソースを使えます。
- AWS コンソールで Serverless Application Repository を開き「使用可能なアプリケーション」を選択
- 検索バーで「splunk-aws-lambda-cloudwatchlogs-processor」を検索
- 「splunk-aws-lambda-cloudwatchlogs-processor」を選択
- アプリケーションの設定を入力してデプロイする
- DebugData:デバッグ用にデータを表示するかどうか
- ELBCookieName:ELB リソースの Cookie 名
- HTTPRequestTimeout:HTTP リクエストのタイムアウト秒数
- HTTPVerifySSL:HTTPリクエストのSSLを検証するかどうか
- SplunkAcknowledgementRequired:HEC ackID を確認するかどうか
- SplunkAcknowledgementRetries:HEC ackID 確認応答の試行回数
- SplunkAcknowledgementWaitSeconds:HEC ackID を確認応答するまでの待機秒数
- SplunkHttpEventCollectorToken:HEC トークン
- SplunkHttpEventCollectorType:生のイベントは(raw)、json イベントは(event)
- SplunkHttpEventCollectorURL:HEC エンドポイント URL
- SplunkSourceType:HEC のソースタイプ
- デプロイしたら、リソースの物理 ID を覚えておいてください。
- CloudWatch のサブスクリプションフィルターを作成する
Lambda 関数を呼び出すための CloudWatch サブスクリプションフィルターを作成する
先ほど作成した Lambda 関数は Splunk Cloud にログを Push するためのもので、これから作成するのは、その Lambda 関数を呼び出すための仕掛けです。
- AWS コンソールで CloudWatch を開き、ロググループを選択
- サブスクリプションフィルターのタブで、作成から「Lambda サブスクリプションフィルターを作成」を選択
- Lambda 関数の項で、先ほどデプロイした Lambda 関数の物理 ID があるもの選択
- サブスクリプションフィルター名を入力
- あとはデフォルトのまま「ストリーミングを開始」を選択
ここまで完了すれば、Splunk Cloud にログが流れているはずです!お疲れ様でした!
Search & Reportings で確認してみましょう。
index="aws-data" sourcetype="aws:cloudwatchlogs:vpcflow"
しっかりログが入っていますね!
まとめ
Lambda 関数を使って Splunk Cloud にログを送信してみました!
Lambdaは実行時間に基づいた課金モデルなので、ログを送信する頻度や量に応じて採用したいところですね!